共计 294 个字符,预计需要花费 1 分钟才能阅读完成。
Verilog 主要有以下几种编程思想或设计方法:
结构化设计(Structural Modeling)
通过实例化模块(module)和连接信号线来描述电路结构,类似于原理图设计。适用于层次化设计,强调模块间的互连关系。
数据流设计(Dataflow Modeling)
用连续赋值(assign)描述信号间的逻辑关系,直接反映数据的流动和转换。例如:
assign out = a & b;
行为级设计(Behavioral Modeling)
使用 always 块和过程语句(如 if、case)描述电路的功能行为,不直接涉及具体硬件实现细节。例如:
always @(posedge clk) begin
if (reset) q <= 0;
else q <= d;
end
RTL 设计(Register-Transfer Level)
结合数据流和行为级设计,明确描述寄存器间的数据传输和组合逻辑,是综合到实际硬件的常用方法。
门级设计(Gate-Level Modeling)
直接调用基本逻辑门(如 and、or、not)进行描述,接近物理级实现,通常由综合工具自动生成。
核心思想差异:
结构化 / 门级:贴近硬件物理连接。
数据流 /RTL:平衡可读性与可综合性。
行为级:抽象功能描述,常用于仿真验证。
1. 并行思维(Parallelism)
硬件本质:所有电路模块同时工作,Verilog 的 always 块、assign 语句等均并行执行。
与软件的区别:
软件是顺序执行(CPU 逐条指令),而 Verilog 描述的是通电即运行的硬件。
例如:两个 always 块不会互相阻塞,就像两个电路模块独立工作。
2. 事件驱动(Event-Driven)
触发条件:通过敏感列表(如 @(posedge clk))定义代码块的执行时机,模拟硬件中的信号变化或时钟边沿触发。
示例:
always @(posedge clk) begin // 仅在时钟上升沿触发
counter <= counter + 1;
end
3. 层次化设计(Hierarchy)
模块化封装:将功能拆分为子模块(如 ALU、FIFO),通过实例化嵌套实现复杂系统。
接口思维:模块间通过输入 / 输出端口通信,类似芯片的引脚连接。
4. 同步与异步分离
同步逻辑:依赖全局时钟(如 always @(posedge clk)),确保时序稳定。
异步逻辑:响应信号变化(如 always @(a or b)),需谨慎处理竞争风险。
5. 可综合 vs 不可综合
可综合代码:描述能映射到实际硬件电路的结构(如 RTL)。
验证代码:使用 initial、$display 等仿真专用语法,仅用于测试。
6. 硬件资源意识
面积与速度权衡:循环(for)可能展开为多级电路,条件分支(if/case)可能生成多路选择器。
避免软件习惯:如动态内存分配、递归等在硬件中无法直接实现。
关键对比:Verilog vs 软件编程
特性 Verilog 软件(如 C)
执行方式 并行 顺序
基本单元 寄存器、组合逻辑 变量、函数
时间控制 时钟周期、信号延迟 无物理时间概念
优化目标 面积、功耗、时序 内存、CPU 效率